// 实现了一个`WebReader`对象，它可以通过 WebSocket 协议与服务器进行通信。
// 它提供了方法来注册结果处理函数、创建和断开WebSocket连接、以及发送数据。此外，它还包含了一个`EventTarget`函数，用于在`reader`对象上管理自定义事件。
// 最后，代码尝试创建一个`WebReader`实例并建立WebSocket连接，如果失败则处理异常

var WebReader =
    {
        OBJ: function () { // 定义一个名为OBJ的方法，它是一个构造函数，当调用时会返回一个新的reader对象。
            var reader = {}; // 创建一个空对象，所有的功能都将作为这个对象的属性添加。
            var SocketOpen = false;// 定义一个布尔变量，用来表示WebSocket连接是否打开。
            var socket = null; // 定义一个变量，用来存储WebSocket对象。
            var target = null; // 定义一个变量，用来存储事件目标对象。

            reader.onResult = function (func) {
                // 定义一个方法，允许用户注册一个回调函数，当WebSocket接收到结果时会被调用。
                target.addEvent("Result", func);
            };

            reader.onResult2 = function (func) {
                // 定义一个方法，允许用户注册一个回调函数，当WebSocket接收到结果时会被调用。
                target.addEvent("Result", func);
            };


            var WSonOpen = function () {
                SocketOpen = true;// 当WebSocket连接打开时，设置SocketOpen为true。
            };

            var WSonMessage = function (msg) {
                var str = "";// 定义一个字符串变量。
                str = msg.data;// 将接收到的WebSocket消息数据赋值给str。

                var resultData =
                    {
                        type: "Result",
                        strStatus: str.substr(4, 2), // 从第4个字符开始截取2个字符，作为状态码。
                        strData: str.substr(6),// 从第6个字符开始截取剩余的字符，作为数据。
                        strCmdCode: str.substr(0, 4), // 从第0个字符开始截取4个字符，作为命令代码。
                    };

                if (target != null)
                    target.fireEvent(resultData); // 如果事件目标对象存在，触发Result事件。
            };

            var WSonClose = function () {
                SocketOpen = false;// 当WebSocket连接关闭时，设置SocketOpen为false。
            };

            var WSonError = function () {
                alert("Server not running !"); // 当WebSocket连接发生错误时，显示一个警告框。
            };

            reader.createSocket = function () {
                try {
                    if ("WebSocket" in window) {
                        socket = new WebSocket("ws://localhost:39002/RFID Reader Service");
                        // 如果浏览器支持WebSocket，创建一个新的WebSocket对象，连接到指定的URL。
                    } else if ("MozWebSocket" in window) {
                        socket = new MozWebSocket("ws://localhost:39002/RFID Reader Service");
                        // 如果浏览器支持MozWebSocket（旧版Firefox），创建一个新的MozWebSocket对象。
                    } else {
                        alert("None"); // 如果浏览器不支持WebSocket，显示一个警告框。
                        return false;// 返回false，表示创建连接失败。
                    }
                    socket.onopen = WSonOpen; // 设置WebSocket的onopen事件处理函数。
                    socket.onmessage = WSonMessage; // 设置WebSocket的onmessage事件处理函数。
                    socket.onclose = WSonClose; // 设置WebSocket的onclose事件处理函数。
                    socket.onerror = WSonError;// 设置WebSocket的onerror事件处理函数。
                    target = new EventTarget();// 创建一个新的EventTarget对象，用来管理事件。
                    return true;// 返回true，表示创建连接成功。
                } catch (ex) {
                    return false; // 如果在尝试创建WebSocket连接时捕获到异常，返回false，表示创建连接失败。
                }
            };

            reader.Disconnect = function () {
                if (socket != null)// 定义一个方法，用来断开WebSocket连接。
                    socket.close();// 如果socket对象存在，调用close方法关闭连接。
            };

            reader.send = function (strParam) {
                // 定义一个方法，用来通过WebSocket发送数据。
                socket.send(strParam);// 如果socket对象存在，通过send方法发送字符串参数strParam。
            }

            return reader;// 返回创建的reader对象，包含所有定义的方法和属性。
        }
    };

function EventTarget() {
    this.handlers = {}; // 创建一个空对象，用来存储事件处理函数。
}

EventTarget.prototype =
    {
        constructor: EventTarget, // 设置构造函数为EventTarget。

        addEvent: function (type, handler) {
            // 定义一个方法，用来添加事件处理函数。
            if (typeof this.handlers[type] == 'undefined') {
                this.handlers[type] = [];// 如果事件类型还未定义，创建一个空数组。
            }
            this.handlers[type].push(handler); // 将处理函数添加到事件类型的数组中。
        },

        fireEvent: function (event) {
            // 定义一个方法，用来触发事件。
            if (!event.target) {
                event.target = this; // 如果事件对象没有target属性，设置当前对象为target。
            }
            if (this.handlers[event.type] instanceof Array) {
                var handlers = this.handlers[event.type];// 获取事件类型的处理函数数组
                for (var i = 0; i < handlers.length; i++) {
                    handlers[i](event); // 遍历处理函数数组，并为每个处理函数传递事件对象。
                }
            }
        },

        removeEvent: function (type, handler) {
            // 定义一个方法，用来移除事件处理函数。
            if (this.handlers[type] instanceof Array) {
                var handlers = this.handlers[type]; // 获取事件类型的处理函数数组。
                for (var i = 0; i < handlers.length; i++) {
                    if (handlers[i] === handler) {
                        break;// 如果找到匹配的处理函数，中断循环。
                    }
                }
                handlers.splice(i, 1); // 从数组中移除找到的处理函数。
            }
        }
    };

try {
    var reader = WebReader.OBJ();// 尝试实例化WebReader对象。
} catch (e) {
    // 如果实例化过程中出现异常，这里可以处理异常（例如，记录日志或通知用户）。
}

if (!reader.createSocket()) {
}
